/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package UI.administrador;

import excepciones.UsuarioNoEsFuncionarioExcepcion;
import excepciones.UsuarioNoExisteExcepcion;
import gestorBD.Controlador;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import static uiMain.bienRaizOk.ventana;


public class PanelModificarMenuUsuario extends JPanel {

    JLabel labelTitulo;
    JLabel labelCedula;
    JTextField campoCedula;
    JButton botonModificarOpciones;
    JButton botonVolver;

    JLabel labelOpcionesPosibles;
    JLabel labelOpcionesActuales;

    JScrollPane scrollOpcionesPosibles = new JScrollPane();
    JScrollPane scrollOpcionesActuales = new JScrollPane();
    JList listaOpcionesPosibles;
    JList listaOpcionesActuales;

    long cedula;

    public PanelModificarMenuUsuario() {
        super();
        this.setLayout(new GridBagLayout());

        GridBagConstraints c = new GridBagConstraints();

        labelTitulo = new JLabel("Modificar el menú de un usuario",SwingConstants.CENTER);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 4;
        c.gridheight = 1;
        this.add(labelTitulo, c);

        labelCedula = new JLabel("Ingrese la cédula del usuario al que le desea modificar el menú: ");
        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 1;
        this.add(labelCedula, c);

        campoCedula = new JTextField();
        campoCedula.setColumns(8);
        c.gridx = 1;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 1;
        this.add(campoCedula, c);

        botonModificarOpciones = new JButton("Modificar opciones");
        //c.fill = GridBagConstraints.NONE;
        c.gridx = 2;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 1;
        this.add(botonModificarOpciones, c);

        labelOpcionesPosibles = new JLabel("Opciones de menú posibles para agregarle a este funcionario");
        labelOpcionesPosibles.setVisible(false);
        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 1;
        c.gridheight = 1;
        this.add(labelOpcionesPosibles, c);

        labelOpcionesActuales = new JLabel("Opciones de menú con las que cuenta este funcionario");
        labelOpcionesActuales.setVisible(false);
        c.gridx = 1;
        c.gridy = 2;
        c.gridwidth = 3;
        c.gridheight = 1;
        this.add(labelOpcionesActuales, c);

        listaOpcionesActuales = new JList(Controlador.getListaDePersonas().toArray());
        listaOpcionesActuales.setVisibleRowCount(4);
        listaOpcionesActuales.setFixedCellWidth(8);
        scrollOpcionesActuales = new JScrollPane(listaOpcionesActuales);
        scrollOpcionesActuales.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollOpcionesActuales.setVisible(false);

        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 1;
        c.gridy = 3;
        c.gridwidth = 3;
        c.gridheight = 4;
        this.add(scrollOpcionesActuales, c);
        
        botonVolver = new JButton("Volver");
        c.gridx = 3;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 1;
        this.add(botonVolver, c);

        
        //Se añaden las funcionalidades
        botonModificarOpciones.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                remove(scrollOpcionesPosibles);
                remove(scrollOpcionesActuales);

                try {
                    cedula = Long.parseLong(campoCedula.getText());
                } catch (Exception ex) {
                    String textoPopUp = "Ingrese una cédula válida";
                    JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                    revalidate();
                    repaint();
                    return;
                }

                try {
                    Object[] arregloDeOpcionesActuales = Controlador.obtenerListaDeOpcionesDeUsuario(cedula);
                    listaOpcionesActuales = new JList(arregloDeOpcionesActuales);
                    listaOpcionesActuales.setVisibleRowCount(4);

                    Object[] arregloDeOpcionesPosibles = Controlador.obtenerListaDeOpcionesPosibles(cedula);
                    listaOpcionesPosibles = new JList(arregloDeOpcionesPosibles);
                    listaOpcionesPosibles.setVisibleRowCount(4);
                } catch (UsuarioNoEsFuncionarioExcepcion exe) {
                    String textoPopUp = "Este usuario no es un funcionario";
                    JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                    labelOpcionesPosibles.setVisible(false);
                    labelOpcionesActuales.setVisible(false);
                    scrollOpcionesPosibles.setVisible(false);
                    scrollOpcionesActuales.setVisible(false);
                    revalidate();
                    repaint();
                    return;
                } catch (UsuarioNoExisteExcepcion exe) {
                    String textoPopUp = "No existe este usuario en el sistema";
                    JOptionPane.showMessageDialog(null, textoPopUp, "Error", JOptionPane.ERROR_MESSAGE);
                    labelOpcionesPosibles.setVisible(false);
                    labelOpcionesActuales.setVisible(false);
                    scrollOpcionesPosibles.setVisible(false);
                    scrollOpcionesActuales.setVisible(false);
                    revalidate();
                    repaint();
                    return;
                }
                labelOpcionesPosibles.setVisible(true);
                labelOpcionesActuales.setVisible(true);

                listaOpcionesPosibles.setVisibleRowCount(4);
                listaOpcionesPosibles.setFixedCellWidth(8);
                scrollOpcionesPosibles = new JScrollPane(listaOpcionesPosibles);
                scrollOpcionesPosibles.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                scrollOpcionesPosibles.setVisible(true);

                c.gridx = 0;
                c.gridy = 3;
                c.gridwidth = 1;
                c.gridheight = 1;
                add(scrollOpcionesPosibles, c);

                listaOpcionesActuales.setVisibleRowCount(4);
                listaOpcionesActuales.setFixedCellWidth(8);
                scrollOpcionesActuales = new JScrollPane(listaOpcionesActuales);
                scrollOpcionesActuales.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                scrollOpcionesActuales.setVisible(true);

                c.gridx = 1;
                c.gridy = 3;
                c.gridwidth = 3;
                c.gridheight = 4;
                add(scrollOpcionesActuales, c);
                revalidate();

                listaOpcionesPosibles.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent mouseEvent) {
                        JList listaTemporal = (JList) mouseEvent.getSource();
                        if (mouseEvent.getClickCount() == 2) {
                            int indice = listaTemporal.locationToIndex(mouseEvent.getPoint());
                            if (indice >= 0) {
                                Object opcionClickeada = listaTemporal.getModel().getElementAt(indice);
                                String nombreOpcionClickeada = opcionClickeada.toString();
                                Controlador.agregarOpcion(cedula, nombreOpcionClickeada);
                                refrescarListaOpcionesActuales();
                            }
                        }
                    }
                });

                listaOpcionesActuales.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent mouseEvent) {
                        JList listaTemporal = (JList) mouseEvent.getSource();
                        if (mouseEvent.getClickCount() == 2) {
                            int indice = listaTemporal.locationToIndex(mouseEvent.getPoint());
                            if (indice >= 0) {
                                Object opcionClickeada = listaTemporal.getModel().getElementAt(indice);
                                String nombreOpcionClickeada = opcionClickeada.toString();
                                Controlador.eliminarOpcion(cedula, nombreOpcionClickeada);
                                refrescarListaOpcionesActuales();
                            }
                        }
                    }
                });
            }

        });
        
        botonVolver.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                ventana.mostrarPanelOpcionesDeAdministrador();
            }
            
        });

    }

    private void refrescarListaOpcionesActuales() {
        this.listaOpcionesActuales.removeAll();
        Object[] arregloDeOpcionesActuales = new Object[1];
        try {
            arregloDeOpcionesActuales = Controlador.obtenerListaDeOpcionesDeUsuario(cedula);
        } catch (Exception e) {

        }
        this.listaOpcionesActuales.setListData(arregloDeOpcionesActuales);
        revalidate();
        repaint();
    }
}
